package com.dferreira.axil.model;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

import com.dferreira.axil.model.Pessoa.TipoDePessoa;

@Entity
public class Vendedor {

	@Id
	@GeneratedValue
	private Long id;

	@NotNull
	@NotEmpty
	@Size(min = 1, max = 50)
	private String nome;

	@Enumerated(EnumType.STRING)
	private TipoDePessoa tipoDePessoa;

	@Size(max = 11)
	@Pattern(regexp = "[^a-zA-Z]*", message = "CPF deve conter apenas números")
	private String cpf;

	private String rg;

	@Size(max = 14)
	@Pattern(regexp = "[^a-zA-Z]*", message = "CNPJ deve conter apenas números")
	private String cnpj;

	@Pattern(regexp = "[^a-zA-Z]*", message = "Inscrição Estadual deve conter apenas números")
	private String inscricaoEstadual;

	@Pattern(regexp = "[^a-zA-Z]*", message = "Inscrição Municipal deve conter apenas números")
	private String inscricaoMunicipal;

	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "endereco")
	private Endereco endereco;

	@Email
	private String email;

	@Pattern(regexp = "[^0-9]*", message = "O telefone deve conter apenas números.")
	private String telefoneComercial;

	@Pattern(regexp = "[^0-9]*", message = "O telefone deve conter apenas números.")
	private String telefoneResidencial;

	@Pattern(regexp = "[^0-9]*", message = "O telefone deve conter apenas números.")
	private String celular;

	private String contato;

	@OneToMany(mappedBy = "vendedor", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<ComissaoExclusiva> comissoesExclusivas;

	@Digits(fraction = 2, integer = 3)
	private Double comissao;

	private Integer diaPagamento;

	@ManyToOne
	private Vendedor superior;

	@Digits(fraction = 2, integer = 3)
	private Double comissaoSuperior;

	@Temporal(TemporalType.TIMESTAMP)
	private Date dataDeCadastro;
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public TipoDePessoa getTipoDePessoa() {
		return tipoDePessoa;
	}

	public void setTipoDePessoa(TipoDePessoa tipoDePessoa) {
		this.tipoDePessoa = tipoDePessoa;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getRg() {
		return rg;
	}

	public void setRg(String rg) {
		this.rg = rg;
	}

	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	public String getInscricaoEstadual() {
		return inscricaoEstadual;
	}

	public void setInscricaoEstadual(String inscricaoEstadual) {
		this.inscricaoEstadual = inscricaoEstadual;
	}

	public String getInscricaoMunicipal() {
		return inscricaoMunicipal;
	}

	public void setInscricaoMunicipal(String inscricaoMunicipal) {
		this.inscricaoMunicipal = inscricaoMunicipal;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getTelefoneComercial() {
		return telefoneComercial;
	}

	public void setTelefoneComercial(String telefoneComercial) {
		this.telefoneComercial = telefoneComercial;
	}

	public String getTelefoneResidencial() {
		return telefoneResidencial;
	}

	public void setTelefoneResidencial(String telefoneResidencial) {
		this.telefoneResidencial = telefoneResidencial;
	}

	public String getCelular() {
		return celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public String getContato() {
		return contato;
	}

	public void setContato(String contato) {
		this.contato = contato;
	}

	public List<ComissaoExclusiva> getComissoesExclusivas() {
		return comissoesExclusivas;
	}

	public void setComissoesExclusivas(
			List<ComissaoExclusiva> comissoesExclusivas) {
		this.comissoesExclusivas = comissoesExclusivas;
	}

	public Double getComissao() {
		return comissao;
	}

	public void setComissao(Double comissao) {
		this.comissao = comissao;
	}

	public Integer getDiaPagamento() {
		return diaPagamento;
	}

	public void setDiaPagamento(Integer diaPagamento) {
		this.diaPagamento = diaPagamento;
	}

	public Vendedor getSuperior() {
		return superior;
	}

	public void setSuperior(Vendedor superior) {
		this.superior = superior;
	}

	public Double getComissaoSuperior() {
		return comissaoSuperior;
	}

	public void setComissaoSuperior(Double comissaoSuperior) {
		this.comissaoSuperior = comissaoSuperior;
	}

	public Date getDataDeCadastro() {
		return dataDeCadastro;
	}

	public void setDataDeCadastro(Date dataDeCadastro) {
		this.dataDeCadastro = dataDeCadastro;
	}

}
